Error Handling 或稱作 Exception Handling,都是在幫我們攔截系統 Runtime 錯誤發生時,所產生的錯誤訊息。(或者為特定目的而 Raise Error)
有了他的協助,我們可以在不影響程式運作的同時,將產生的錯誤做追蹤處理,這對除錯來說是相當有幫助的。更有幫助的是,程式不會而當掉無法執行(當然得看發生錯誤的嚴重程度以及是否能夠由程式 Handle)
好習慣,是在您的程式模組中加上 Exception Handling 的 Block,如:
Try
' Your Code
Catch e as ExceptionType
' Error Handling
Finally
' Release Object
End Try
一個程式模組,最好擁有一個 Exception Handling Block,當然也可以有多個,但是追蹤較不容易,可以透過不同的 Error Catch Block 去攔截不同的錯誤型態,如:
Try
' Your Code
Catch e as ExceptionTypeI
' Error Handling
Catch e as ExceptionTypeII
' Error Handling
Catch e as ExceptionTypeIII
' Error Handling
Finally
' Release Object
End Try
而作不同的處理。從 Dot Net 開始,VB 都提供同樣的 Exception Handling 模式,算是跟上潮流的腳步。
如果您還是寫 VBA(指 Office 2003,2007 是否改採 .Net 我就沒試過了),那只能這樣處理:
On Error Goto ErrorHandling
' Your Code
ExitSub:
' Release Object
Exit Sub
ErrorHandling:
' Error Handling
Resume ExitSub
當然如果您要做到不同錯誤型態的處理,那麼就要借助不同的 Label 來區隔,但用起來 Goto 來 Goto 去的總是不方便就是。
那麼,Error Handling 要處理什麼?這可是個好問題!
您也許會說,很簡單呀!就像這樣:
ErrorHandling:
msgbox Err.Description
將 VB 內建的錯誤訊息直接顯示出來。也許您會很容易就能掌握著錯誤訊息的資訊,但是,要記得執行程式的人是使用者,告訴他這種錯誤訊息,只會增加使用者的困擾,對他來說並沒有太大的幫助。
但,至少這也是一種處理方式。千萬不要懶惰到,
ErrorHandling:
msgbox "很抱歉!有錯誤發生!請通知管理人員!"
這跟「有怪獸!有怪獸!」有什麼兩樣!
最好是您將攔截到的錯誤,先做整理與分析,如果是使用者輸入資料的錯誤,那麼就提醒使用者,該輸入什麼資料(當然這寫在 Validation 的部份會比較好),如同上一篇除錯中所提的,您可以將一些資訊加以定義,提供程式編號等訊息傳達給使用者,這樣對使用者的操作經驗,會比較舒服,程式也不是硬梆梆的沒有人味。對開發人員來說,都能達到事半功倍之效。(像 Google Chrome 的錯誤處理機制,就蠻人性化的)
我自己有一個小技巧,就是將攔截到資訊以及程式執行的 Stack Strace Dump 出來,寫到 Log 或直接發 email 出來(待物件導向階段的範例再來說明)。
這一點相當有幫助,那就是在 User 反應問題前,如果我還不了解程式的錯誤原因,我就會先打電話給使用者,問他剛剛是做了什麼動作,他們總是會很驚訝,為什麼我會知道他們發生什麼問題!真的,傑克真是太神奇了!
這樣處理事情真的容易太多了!^^b 使用者會覺得你很親切,然後會鉅細靡遺的告訴你,他們做了什麼事情!其實也不過就是攔截錯誤訊息而已!不過太常發生,也是會讓人起疑的,表示程式寫得有問題...XD
ErrorHandling:
msgbox "很抱歉!有錯誤發生!請通知管理人員!"
上面這二行.我覺得意義也不大.
我的做法.會是在這二行中加一些處理.
比如說將錯誤寫到Client或Server的Log檔或資料庫.
或者用EMail或SMS通知管理人員直接處理.
然後將錯誤訊息改成使用者看得懂得.並Show出錯誤碼.
然後由使用者告訴管理者錯誤碼.管理者至Log或其他地方找出明確的錯誤資訊.
然後進行修護動作.
^^b